//HEADER_GOES_HERE

#include "../types.h"

int trigflag[5];
TriggerStruct trigs[5];
int TWarpFrom; // weak

int TownDownList[11] = { 716, 715, 719, 720, 721, 723, 724, 725, 726, 727, -1 };
int TownWarp1List[13] =
{
  1171,
  1172,
  1173,
  1174,
  1175,
  1176,
  1177,
  1178,
  1179,
  1181,
  1183,
  1185,
  -1
};
int L1UpList[12] = { 127, 129, 130, 131, 132, 133, 135, 137, 138, 139, 140, -1 };
int L1DownList[10] = { 106, 107, 108, 109, 110, 112, 114, 115, 118, -1 };
int L2UpList[3] = { 266, 267, -1 };
int L2DownList[5] = { 269, 270, 271, 272, -1 };
int L2TWarpUpList[3] = { 558, 559, -1 };
int L3UpList[15] =
{
  170,
  171,
  172,
  173,
  174,
  175,
  176,
  177,
  178,
  179,
  180,
  181,
  182,
  183,
  -1
};
int L3DownList[9] = { 162, 163, 164, 165, 166, 167, 168, 169, -1 };
int L3TWarpUpList[14] = { 548, 549, 550, 551, 552, 553, 554, 555, 556, 557, 558, 559, 560, -1 };
int L4UpList[4] = { 82, 83, 90, -1 };
int L4DownList[6] = { 120, 130, 131, 132, 133, -1 };
int L4TWarpUpList[4] = { 421, 422, 429, -1 };
int L4PentaList[33] =
{
  353,
  354,
  355,
  356,
  357,
  358,
  359,
  360,
  361,
  362,
  363,
  364,
  365,
  366,
  367,
  368,
  369,
  370,
  371,
  372,
  373,
  374,
  375,
  376,
  377,
  378,
  379,
  380,
  381,
  382,
  383,
  384,
  -1
};

//----- (004619A7) --------------------------------------------------------
void __cdecl InitNoTriggers()
{
	trigflag[4] = 0;
	trigflag[3] = 0;
}

//----- (004619B6) --------------------------------------------------------
void __cdecl InitTownTriggers()
{
	char v0; // bl
	int v1; // eax
	int v2; // eax

	trigs[0]._tx = 25;
	trigs[0]._ty = 29;
	trigs[0]._tmsg = 1026;
	trigflag[4] = 1;
	if ( gbMaxPlayers == 4 )
	{
		trigs[1]._tx = 49;
		trigflag[0] = 1;
		trigflag[1] = 1;
		trigflag[2] = 1;
		trigs[1]._ty = 21;
		trigs[1]._tmsg = 1031;
		trigs[1]._tlvl = 5;
		trigs[2]._tx = 17;
		trigs[2]._ty = 69;
		trigs[2]._tmsg = 1031;
		trigs[2]._tlvl = 9;
		trigs[3]._tx = 41;
		trigs[3]._ty = 80;
		trigs[3]._tmsg = 1031;
		trigs[3]._tlvl = 13;
		trigflag[4] = 4;
	}
	else
	{
		trigflag[0] = 0;
		trigflag[1] = 0;
		trigflag[2] = 0;
		v0 = plr[myplr].pTownWarps;
		if ( v0 & 1 )
		{
			trigs[1]._tx = 49;
			trigs[1]._ty = 21;
			trigs[1]._tmsg = 1031;
			trigs[1]._tlvl = 5;
			trigflag[4] = 2;
			trigflag[0] = 1;
		}
		if ( v0 & 2 )
		{
			trigflag[1] = 1;
			v1 = trigflag[4]++;
			trigs[v1]._tx = 17;
			trigs[v1]._ty = 69;
			trigs[v1]._tmsg = 1031;
			trigs[v1]._tlvl = 9;
		}
		if ( v0 & 4 )
		{
			trigflag[2] = 1;
			v2 = trigflag[4]++;
			trigs[v2]._tx = 41;
			trigs[v2]._ty = 80;
			trigs[v2]._tmsg = 1031;
			trigs[v2]._tlvl = 13;
		}
	}
	trigflag[3] = 0;
}
// 679660: using guessed type char gbMaxPlayers;

//----- (00461B45) --------------------------------------------------------
void __cdecl InitL1Triggers()
{
	int v0; // edi
	signed int v1; // esi
	int *v2; // edx
	int *v3; // ecx
	TriggerStruct *v4; // eax
	int (*v5)[112]; // [esp+Ch] [ebp-8h]
	int (*v6)[112]; // [esp+10h] [ebp-4h]

	v0 = 0;
	trigflag[4] = 0;
	v5 = dPiece;
	do
	{
		v1 = 0;
		v6 = v5;
		v2 = &trigs[trigflag[4]]._tmsg;
		v3 = &trigs[trigflag[4]]._ty;
		v4 = &trigs[trigflag[4]];
		do
		{
			if ( (*v6)[0] == 129 )
			{
				++trigflag[4];
				v4->_tx = v1;
				*v3 = v0;
				*v2 = 1027;
				++v4;
				v3 += 4;
				v2 += 4;
			}
			if ( (*v6)[0] == 115 )
			{
				++trigflag[4];
				v4->_tx = v1;
				*v3 = v0;
				*v2 = 1026;
				++v4;
				v3 += 4;
				v2 += 4;
			}
			++v6;
			++v1;
		}
		while ( v1 < 112 );
		v5 = (int (*)[112])((char *)v5 + 4);
		++v0;
	}
	while ( (signed int)v5 < (signed int)dPiece[1] );
	trigflag[3] = 0;
}

//----- (00461BEE) --------------------------------------------------------
void __cdecl InitL2Triggers()
{
	signed int v0; // edi
	int *v1; // esi
	int *v2; // edx
	TriggerStruct *v3; // ecx
	int *v4; // eax
	int (*v5)[112]; // [esp+Ch] [ebp-10h]
	int (*v6)[112]; // [esp+10h] [ebp-Ch]
	int v7; // [esp+14h] [ebp-8h]
	int *v8; // [esp+18h] [ebp-4h]

	trigflag[4] = 0;
	v7 = 0;
	v5 = dPiece;
	do
	{
		v0 = 0;
		v1 = &trigs[trigflag[4]]._tmsg;
		v2 = &trigs[trigflag[4]]._ty;
		v3 = &trigs[trigflag[4]];
		v8 = &trigs[trigflag[4]]._tlvl;
		v6 = v5;
		do
		{
			if ( (*v6)[0] == 267 && (v0 != quests[14]._qtx || v7 != quests[14]._qty) )
			{
				++trigflag[4];
				v8 += 4;
				v3->_tx = v0;
				*v2 = v7;
				*v1 = 1027;
				++v3;
				v2 += 4;
				v1 += 4;
			}
			if ( (*v6)[0] == 559 )
			{
				v3->_tx = v0;
				*v2 = v7;
				v4 = v8;
				v8 += 4;
				*v1 = 1032;
				*v4 = 0;
				++trigflag[4];
				++v3;
				v2 += 4;
				v1 += 4;
			}
			if ( (*v6)[0] == 271 )
			{
				++trigflag[4];
				v8 += 4;
				v3->_tx = v0;
				*v2 = v7;
				*v1 = 1026;
				++v3;
				v2 += 4;
				v1 += 4;
			}
			++v6;
			++v0;
		}
		while ( v0 < 112 );
		v5 = (int (*)[112])((char *)v5 + 4);
		++v7;
	}
	while ( (signed int)v5 < (signed int)dPiece[1] );
	trigflag[3] = 0;
}

//----- (00461CF6) --------------------------------------------------------
void __cdecl InitL3Triggers()
{
	int v0; // edi
	signed int v1; // esi
	int *v2; // edx
	int *v3; // ecx
	TriggerStruct *v4; // eax
	int (*v5)[112]; // [esp+Ch] [ebp-8h]
	int (*v6)[112]; // [esp+10h] [ebp-4h]

	v0 = 0;
	trigflag[4] = 0;
	v5 = dPiece;
	do
	{
		v1 = 0;
		v6 = v5;
		v2 = &trigs[trigflag[4]]._tmsg;
		v3 = &trigs[trigflag[4]]._ty;
		v4 = &trigs[trigflag[4]];
		do
		{
			if ( (*v6)[0] == 171 )
			{
				++trigflag[4];
				v4->_tx = v1;
				*v3 = v0;
				*v2 = 1027;
				++v4;
				v3 += 4;
				v2 += 4;
			}
			if ( (*v6)[0] == 168 )
			{
				++trigflag[4];
				v4->_tx = v1;
				*v3 = v0;
				*v2 = 1026;
				++v4;
				v3 += 4;
				v2 += 4;
			}
			if ( (*v6)[0] == 549 )
			{
				++trigflag[4];
				v4->_tx = v1;
				*v3 = v0;
				*v2 = 1032;
				++v4;
				v3 += 4;
				v2 += 4;
			}
			++v6;
			++v1;
		}
		while ( v1 < 112 );
		v5 = (int (*)[112])((char *)v5 + 4);
		++v0;
	}
	while ( (signed int)v5 < (signed int)dPiece[1] );
	trigflag[3] = 0;
}

//----- (00461DC6) --------------------------------------------------------
void __cdecl InitL4Triggers()
{
	signed int v0; // edi
	int *v1; // esi
	int *v2; // edx
	TriggerStruct *v3; // ecx
	int *v4; // eax
	int v5; // edx
	int (*v6)[112]; // edi
	signed int v7; // ecx
	int *v8; // eax
	int (*v9)[112]; // [esp+Ch] [ebp-Ch]
	int (*v10)[112]; // [esp+Ch] [ebp-Ch]
	int v11; // [esp+10h] [ebp-8h]
	int (*v12)[112]; // [esp+14h] [ebp-4h]

	trigflag[4] = 0;
	v11 = 0;
	v9 = dPiece;
	do
	{
		v0 = 0;
		v12 = v9;
		v1 = &trigs[trigflag[4]]._tmsg;
		v2 = &trigs[trigflag[4]]._ty;
		v3 = &trigs[trigflag[4]];
		v4 = &trigs[trigflag[4]]._tlvl;
		do
		{
			if ( (*v12)[0] == 83 )
			{
				++trigflag[4];
				v3->_tx = v0;
				*v2 = v11;
				*v1 = 1027;
				v4 += 4;
				++v3;
				v2 += 4;
				v1 += 4;
			}
			if ( (*v12)[0] == 422 )
			{
				v3->_tx = v0;
				*v2 = v11;
				*v1 = 1032;
				*v4 = 0;
				++trigflag[4];
				v4 += 4;
				++v3;
				v2 += 4;
				v1 += 4;
			}
			if ( (*v12)[0] == 120 )
			{
				++trigflag[4];
				v3->_tx = v0;
				*v2 = v11;
				*v1 = 1026;
				v4 += 4;
				++v3;
				v2 += 4;
				v1 += 4;
			}
			++v12;
			++v0;
		}
		while ( v0 < 112 );
		v9 = (int (*)[112])((char *)v9 + 4);
		++v11;
	}
	while ( (signed int)v9 < (signed int)dPiece[1] );
	v5 = 0;
	v10 = dPiece;
	do
	{
		v6 = v10;
		v7 = 0;
		v8 = &trigs[trigflag[4]]._ty;
		do
		{
			if ( (*v6)[0] == 370 && quests[15]._qactive == 3 )
			{
				++trigflag[4];
				*(v8 - 1) = v7;
				*v8 = v5;
				v8[1] = 1026;
				v8 += 4;
			}
			++v7;
			++v6;
		}
		while ( v7 < 112 );
		v10 = (int (*)[112])((char *)v10 + 4);
		++v5;
	}
	while ( (signed int)v10 < (signed int)dPiece[1] );
	trigflag[3] = 0;
}

//----- (00461F0A) --------------------------------------------------------
void __cdecl InitSKingTriggers()
{
	trigflag[3] = 0;
	trigflag[4] = 1;
	trigs[0]._tx = 82;
	trigs[0]._ty = 42;
	trigs[0]._tmsg = 1028;
}

//----- (00461F3A) --------------------------------------------------------
void __cdecl InitSChambTriggers()
{
	trigflag[3] = 0;
	trigflag[4] = 1;
	trigs[0]._tx = 70;
	trigs[0]._ty = 39;
	trigs[0]._tmsg = 1028;
}

//----- (00461F6A) --------------------------------------------------------
void __cdecl InitPWaterTriggers()
{
	trigflag[3] = 0;
	trigflag[4] = 1;
	trigs[0]._tx = 30;
	trigs[0]._ty = 83;
	trigs[0]._tmsg = 1028;
}

//----- (00461F9A) --------------------------------------------------------
void __cdecl InitVPTriggers()
{
	trigflag[3] = 0;
	trigflag[4] = 1;
	trigs[0]._tx = 35;
	trigs[0]._ty = 32;
	trigs[0]._tmsg = 1028;
}

//----- (00461FCA) --------------------------------------------------------
unsigned char __cdecl ForceTownTrig()
{
	int v0; // edx
	int *v1; // esi
	int v2; // edx
	int *v3; // esi
	signed int v4; // esi
	signed int v5; // edx

	v0 = TownDownList[0];
	if ( TownDownList[0] != -1 )
	{
		v1 = TownDownList;
		while ( dPiece[0][cursmy + 112 * cursmx] != v0 )
		{
			++v1;
			v0 = *v1;
			if ( *v1 == -1 )
				goto LABEL_5;
		}
		strcpy(infostr, "Down to dungeon");
		cursmx = 25;
		cursmy = 29;
		return 1;
	}
LABEL_5:
	if ( trigflag[0] )
	{
		v2 = TownWarp1List[0];
		if ( TownWarp1List[0] != -1 )
		{
			v3 = TownWarp1List;
			while ( dPiece[0][cursmy + 112 * cursmx] != v2 )
			{
				++v3;
				v2 = *v3;
				if ( *v3 == -1 )
					goto LABEL_13;
			}
			strcpy(infostr, "Down to catacombs");
			cursmx = 49;
			cursmy = 21;
			return 1;
		}
	}
LABEL_13:
	if ( trigflag[1] )
	{
		v4 = 1199;
		while ( dPiece[0][cursmy + 112 * cursmx] != v4 )
		{
			if ( ++v4 > 1220 )
				goto LABEL_17;
		}
		strcpy(infostr, "Down to caves");
		cursmx = 17;
		cursmy = 69;
		return 1;
	}
LABEL_17:
	if ( trigflag[2] )
	{
		v5 = 1240;
		while ( dPiece[0][cursmy + 112 * cursmx] != v5 )
		{
			if ( ++v5 > 1255 )
				return 0;
		}
		strcpy(infostr, "Down to hell");
		cursmx = 41;
		cursmy = 80;
		return 1;
	}
	return 0;
}

//----- (00462130) --------------------------------------------------------
unsigned char __cdecl ForceL1Trig()
{
	int *v0; // eax
	int *v1; // esi
	int v2; // eax
	int *v3; // edx
	int *v4; // eax
	int *v5; // esi
	int *v6; // edx
	int v8; // eax
	int v9; // ecx

	if ( L1UpList[0] == -1 )
	{
LABEL_12:
		if ( L1DownList[0] == -1 )
			return 0;
		v4 = L1DownList;
		v5 = L1DownList;
		while ( 1 )
		{
			if ( dPiece[0][cursmy + 112 * cursmx] == *v4 )
			{
				sprintf(infostr, "Down to level %i", currlevel + 1);
				v2 = 0;
				if ( trigflag[4] > 0 )
					break;
			}
LABEL_19:
			++v5;
			v4 = v5;
			if ( *v5 == -1 )
				return 0;
		}
		v6 = &trigs[0]._tmsg;
		while ( *v6 != 1026 )
		{
			++v2;
			v6 += 4;
			if ( v2 >= trigflag[4] )
				goto LABEL_19;
		}
	}
	else
	{
		v0 = L1UpList;
		v1 = L1UpList;
		while ( 1 )
		{
			if ( dPiece[0][cursmy + 112 * cursmx] == *v0 )
			{
				if ( currlevel <= 1u )
					strcpy(infostr, "Up to town");
				else
					sprintf(infostr, "Up to level %i", currlevel - 1);
				v2 = 0;
				if ( trigflag[4] > 0 )
					break;
			}
LABEL_11:
			++v1;
			v0 = v1;
			if ( *v1 == -1 )
				goto LABEL_12;
		}
		v3 = &trigs[0]._tmsg;
		while ( *v3 != 1027 )
		{
			++v2;
			v3 += 4;
			if ( v2 >= trigflag[4] )
				goto LABEL_11;
		}
	}
	v8 = v2;
	v9 = trigs[v8]._tx;
	cursmy = trigs[v8]._ty;
	cursmx = v9;
	return 1;
}

//----- (0046224C) --------------------------------------------------------
unsigned char __cdecl ForceL2Trig()
{
	int *v0; // eax
	int *v1; // ebp
	int v2; // edi
	TriggerStruct *v3; // esi
	int v4; // ebx
	int v5; // eax
	int *v6; // eax
	int *v7; // esi
	int v8; // eax
	int *v9; // ecx
	int v10; // eax
	int v11; // ecx
	int v12; // eax
	int *v13; // eax
	int *v14; // ebp
	TriggerStruct *v15; // esi
	int v16; // ebx
	int v17; // eax
	int v19; // edi

	if ( L2UpList[0] == -1 )
	{
LABEL_11:
		if ( L2DownList[0] != -1 )
		{
			v6 = L2DownList;
			v7 = L2DownList;
			while ( 1 )
			{
				if ( dPiece[0][cursmy + 112 * cursmx] == *v6 )
				{
					sprintf(infostr, "Down to level %i", currlevel + 1);
					v8 = 0;
					if ( trigflag[4] > 0 )
						break;
				}
LABEL_18:
				++v7;
				v6 = v7;
				if ( *v7 == -1 )
					goto LABEL_22;
			}
			v9 = &trigs[0]._tmsg;
			while ( *v9 != 1026 )
			{
				++v8;
				v9 += 4;
				if ( v8 >= trigflag[4] )
					goto LABEL_18;
			}
			v10 = v8;
			v11 = trigs[v10]._tx;
			v12 = trigs[v10]._ty;
			cursmx = v11;
			goto LABEL_37;
		}
LABEL_22:
		if ( currlevel != 5 || L2TWarpUpList[0] == -1 )
			return 0;
		v13 = L2TWarpUpList;
		v14 = L2TWarpUpList;
		while ( 1 )
		{
			if ( dPiece[0][cursmy + 112 * cursmx] == *v13 )
			{
				v2 = 0;
				if ( trigflag[4] > 0 )
					break;
			}
LABEL_32:
			++v14;
			v13 = v14;
			if ( *v14 == -1 )
				return 0;
		}
		v15 = trigs;
		while ( 1 )
		{
			if ( v15->_tmsg == 1032 )
			{
				v16 = abs(v15->_tx - cursmx);
				v17 = abs(v15->_ty - cursmy);
				if ( v16 < 4 && v17 < 4 )
					break;
			}
			++v2;
			++v15;
			if ( v2 >= trigflag[4] )
				goto LABEL_32;
		}
		strcpy(infostr, "Up to town");
	}
	else
	{
		v0 = L2UpList;
		v1 = L2UpList;
		while ( 1 )
		{
			if ( dPiece[0][cursmy + 112 * cursmx] == *v0 )
			{
				v2 = 0;
				if ( trigflag[4] > 0 )
					break;
			}
LABEL_10:
			++v1;
			v0 = v1;
			if ( *v1 == -1 )
				goto LABEL_11;
		}
		v3 = trigs;
		while ( 1 )
		{
			if ( v3->_tmsg == 1027 )
			{
				v4 = abs(v3->_tx - cursmx);
				v5 = abs(v3->_ty - cursmy);
				if ( v4 < 4 && v5 < 4 )
					break;
			}
			++v2;
			++v3;
			if ( v2 >= trigflag[4] )
				goto LABEL_10;
		}
		sprintf(infostr, "Up to level %i", currlevel - 1);
	}
	v19 = v2;
	cursmx = trigs[v19]._tx;
	v12 = trigs[v19]._ty;
LABEL_37:
	cursmy = v12;
	return 1;
}

//----- (0046244F) --------------------------------------------------------
unsigned char __cdecl ForceL3Trig()
{
	int *v0; // eax
	int *v1; // esi
	int v2; // eax
	int *v3; // ecx
	int *v4; // ecx
	int *v5; // esi
	int v6; // ecx
	int v7; // eax
	int *v8; // ecx
	int *v9; // eax
	int *v10; // ebp
	int v11; // edi
	TriggerStruct *v12; // esi
	int v13; // ebx
	int v14; // eax
	int v15; // eax
	int v16; // ecx
	int v17; // eax
	int v18; // edi

	if ( L3UpList[0] != -1 )
	{
		v0 = L3UpList;
		v1 = L3UpList;
		while ( 1 )
		{
			if ( dPiece[0][cursmy + 112 * cursmx] == *v0 )
			{
				sprintf(infostr, "Up to level %i", currlevel - 1);
				v2 = 0;
				if ( trigflag[4] > 0 )
					break;
			}
LABEL_8:
			++v1;
			v0 = v1;
			if ( *v1 == -1 )
				goto LABEL_9;
		}
		v3 = &trigs[0]._tmsg;
		while ( *v3 != 1027 )
		{
			++v2;
			v3 += 4;
			if ( v2 >= trigflag[4] )
				goto LABEL_8;
		}
		goto LABEL_31;
	}
LABEL_9:
	if ( L3DownList[0] != -1 )
	{
		v4 = L3DownList;
		v5 = L3DownList;
		while ( 1 )
		{
			v6 = *v4;
			v7 = cursmy + 112 * cursmx;
			if ( dPiece[0][v7] == v6 || dPiece[1][v7] == v6 || dPiece[2][v7] == v6 )
			{
				sprintf(infostr, "Down to level %i", currlevel + 1);
				v2 = 0;
				if ( trigflag[4] > 0 )
					break;
			}
LABEL_18:
			++v5;
			v4 = v5;
			if ( *v5 == -1 )
				goto LABEL_19;
		}
		v8 = &trigs[0]._tmsg;
		while ( *v8 != 1026 )
		{
			++v2;
			v8 += 4;
			if ( v2 >= trigflag[4] )
				goto LABEL_18;
		}
LABEL_31:
		v15 = v2;
		v16 = trigs[v15]._tx;
		v17 = trigs[v15]._ty;
		cursmx = v16;
LABEL_33:
		cursmy = v17;
		return 1;
	}
LABEL_19:
	if ( currlevel == 9 && L3TWarpUpList[0] != -1 )
	{
		v9 = L3TWarpUpList;
		v10 = L3TWarpUpList;
		while ( 1 )
		{
			if ( dPiece[0][cursmy + 112 * cursmx] == *v9 )
			{
				v11 = 0;
				if ( trigflag[4] > 0 )
					break;
			}
LABEL_29:
			++v10;
			v9 = v10;
			if ( *v10 == -1 )
				return 0;
		}
		v12 = trigs;
		while ( 1 )
		{
			if ( v12->_tmsg == 1032 )
			{
				v13 = abs(v12->_tx - cursmx);
				v14 = abs(v12->_ty - cursmy);
				if ( v13 < 4 && v14 < 4 )
					break;
			}
			++v11;
			++v12;
			if ( v11 >= trigflag[4] )
				goto LABEL_29;
		}
		strcpy(infostr, "Up to town");
		v18 = v11;
		cursmx = trigs[v18]._tx;
		v17 = trigs[v18]._ty;
		goto LABEL_33;
	}
	return 0;
}

//----- (0046262D) --------------------------------------------------------
unsigned char __cdecl ForceL4Trig()
{
	int *v0; // eax
	int *v1; // esi
	int v2; // eax
	int *v3; // ecx
	int *v4; // eax
	int *v5; // esi
	int *v6; // ecx
	int *v7; // eax
	int *v8; // ebp
	int v9; // edi
	TriggerStruct *v10; // esi
	int v11; // ebx
	int v12; // eax
	int *v13; // eax
	int *v14; // esi
	int *v15; // edx
	int v16; // edi
	int v17; // eax
	int v18; // eax
	int v19; // ecx

	if ( L4UpList[0] != -1 )
	{
		v0 = L4UpList;
		v1 = L4UpList;
		while ( 1 )
		{
			if ( dPiece[0][cursmy + 112 * cursmx] == *v0 )
			{
				sprintf(infostr, "Up to level %i", currlevel - 1);
				v2 = 0;
				if ( trigflag[4] > 0 )
					break;
			}
LABEL_8:
			++v1;
			v0 = v1;
			if ( *v1 == -1 )
				goto LABEL_9;
		}
		v3 = &trigs[0]._tmsg;
		while ( *v3 != 1027 )
		{
			++v2;
			v3 += 4;
			if ( v2 >= trigflag[4] )
				goto LABEL_8;
		}
		goto LABEL_39;
	}
LABEL_9:
	if ( L4DownList[0] != -1 )
	{
		v4 = L4DownList;
		v5 = L4DownList;
		while ( 1 )
		{
			if ( dPiece[0][cursmy + 112 * cursmx] == *v4 )
			{
				sprintf(infostr, "Down to level %i", currlevel + 1);
				v2 = 0;
				if ( trigflag[4] > 0 )
					break;
			}
LABEL_16:
			++v5;
			v4 = v5;
			if ( *v5 == -1 )
				goto LABEL_17;
		}
		v6 = &trigs[0]._tmsg;
		while ( *v6 != 1026 )
		{
			++v2;
			v6 += 4;
			if ( v2 >= trigflag[4] )
				goto LABEL_16;
		}
		goto LABEL_39;
	}
LABEL_17:
	if ( currlevel == 13 )
	{
		if ( L4TWarpUpList[0] != -1 )
		{
			v7 = L4TWarpUpList;
			v8 = L4TWarpUpList;
			while ( 1 )
			{
				if ( dPiece[0][cursmy + 112 * cursmx] == *v7 )
				{
					v9 = 0;
					if ( trigflag[4] > 0 )
						break;
				}
LABEL_27:
				++v8;
				v7 = v8;
				if ( *v8 == -1 )
					goto LABEL_28;
			}
			v10 = trigs;
			while ( 1 )
			{
				if ( v10->_tmsg == 1032 )
				{
					v11 = abs(v10->_tx - cursmx);
					v12 = abs(v10->_ty - cursmy);
					if ( v11 < 4 && v12 < 4 )
						break;
				}
				++v9;
				++v10;
				if ( v9 >= trigflag[4] )
					goto LABEL_27;
			}
			strcpy(infostr, "Up to town");
			v16 = v9;
			cursmx = trigs[v16]._tx;
			v17 = trigs[v16]._ty;
			goto LABEL_40;
		}
	}
	else
	{
LABEL_28:
		if ( currlevel == 15 && L4PentaList[0] != -1 )
		{
			v13 = L4PentaList;
			v14 = L4PentaList;
			while ( 1 )
			{
				if ( dPiece[0][cursmy + 112 * cursmx] == *v13 )
				{
					strcpy(infostr, "Down to Diablo");
					v2 = 0;
					if ( trigflag[4] > 0 )
						break;
				}
LABEL_36:
				++v14;
				v13 = v14;
				if ( *v14 == -1 )
					return 0;
			}
			v15 = &trigs[0]._tmsg;
			while ( *v15 != 1026 )
			{
				++v2;
				v15 += 4;
				if ( v2 >= trigflag[4] )
					goto LABEL_36;
			}
LABEL_39:
			v18 = v2;
			v19 = trigs[v18]._tx;
			v17 = trigs[v18]._ty;
			cursmx = v19;
LABEL_40:
			cursmy = v17;
			return 1;
		}
	}
	return 0;
}

//----- (00462876) --------------------------------------------------------
void __cdecl Freeupstairs()
{
	int *v0; // ecx
	int v1; // ebx
	char *v2; // eax
	signed int v3; // edi
	char *v4; // edx
	signed int v5; // esi

	if ( trigflag[4] > 0 )
	{
		v0 = &trigs[0]._ty;
		v1 = trigflag[4];
		do
		{
			v2 = &nBlockTable[112 * *(v0 - 1) + 1830 + *v0];
			v3 = 5;
			do
			{
				v4 = v2;
				v5 = 5;
				do
				{
					*v4 |= 8u;
					v4 += 112;
					--v5;
				}
				while ( v5 );
				++v2;
				--v3;
			}
			while ( v3 );
			v0 += 4;
			--v1;
		}
		while ( v1 );
	}
}

//----- (004628B7) --------------------------------------------------------
unsigned char __cdecl ForceSKingTrig()
{
	int v0; // eax
	int *v1; // ecx

	v0 = L1UpList[0];
	if ( L1UpList[0] == -1 )
		return 0;
	v1 = L1UpList;
	while ( dPiece[0][cursmy + 112 * cursmx] != v0 )
	{
		++v1;
		v0 = *v1;
		if ( *v1 == -1 )
			return 0;
	}
	sprintf(infostr, "Back to Level %i", (unsigned char)quests[12]._qlevel);
	cursmx = trigs[0]._tx;
	cursmy = trigs[0]._ty;
	return 1;
}

//----- (0046291F) --------------------------------------------------------
unsigned char __cdecl ForceSChambTrig()
{
	int v0; // eax
	int *v1; // ecx

	v0 = L2DownList[0];
	if ( L2DownList[0] == -1 )
		return 0;
	v1 = L2DownList;
	while ( dPiece[0][cursmy + 112 * cursmx] != v0 )
	{
		++v1;
		v0 = *v1;
		if ( *v1 == -1 )
			return 0;
	}
	sprintf(infostr, "Back to Level %i", (unsigned char)quests[14]._qlevel);
	cursmx = trigs[0]._tx;
	cursmy = trigs[0]._ty;
	return 1;
}

//----- (00462987) --------------------------------------------------------
unsigned char __cdecl ForcePWaterTrig()
{
	int v0; // eax
	int *v1; // ecx

	v0 = L3DownList[0];
	if ( L3DownList[0] == -1 )
		return 0;
	v1 = L3DownList;
	while ( dPiece[0][cursmy + 112 * cursmx] != v0 )
	{
		++v1;
		v0 = *v1;
		if ( *v1 == -1 )
			return 0;
	}
	sprintf(infostr, "Back to Level %i", (unsigned char)quests[13]._qlevel);
	cursmx = trigs[0]._tx;
	cursmy = trigs[0]._ty;
	return 1;
}

//----- (004629EF) --------------------------------------------------------
void __cdecl CheckTrigForce()
{
	int v0; // eax
	int v1; // eax

	trigflag[3] = 0;
	if ( MouseY <= 351 )
	{
		if ( setlevel )
		{
			switch ( setlvlnum )
			{
				case SL_SKELKING:
					v1 = ForceSKingTrig();
					break;
				case SL_BONECHAMB:
					v1 = ForceSChambTrig();
					break;
				case SL_POISONWATER:
					v1 = ForcePWaterTrig();
					break;
				default:
					return;
			}
			goto LABEL_23;
		}
		if ( leveltype )
		{
			switch ( leveltype )
			{
				case DTYPE_CATHEDRAL:
					v0 = ForceL1Trig();
					break;
				case DTYPE_CATACOMBS:
					v0 = ForceL2Trig();
					break;
				case DTYPE_CAVES:
					v0 = ForceL3Trig();
					break;
				case DTYPE_HELL:
					v0 = ForceL4Trig();
					break;
				default:
LABEL_14:
					if ( !leveltype )
						goto LABEL_24;
					if ( trigflag[3] )
					{
LABEL_25:
						ClearPanel();
						return;
					}
					v1 = ForceQuests();
LABEL_23:
					trigflag[3] = v1;
LABEL_24:
					if ( !trigflag[3] )
						return;
					goto LABEL_25;
			}
		}
		else
		{
			v0 = ForceTownTrig();
		}
		trigflag[3] = v0;
		goto LABEL_14;
	}
}
// 5BB1ED: using guessed type char leveltype;
// 5CCB10: using guessed type char setlvlnum;
// 5CF31D: using guessed type char setlevel;

//----- (00462A9D) --------------------------------------------------------
void __cdecl CheckTriggers()
{
	int *v0; // edi
	int v1; // esi
	int v2; // ecx
	int v3; // eax
	int v4; // edx
	signed int v5; // edx
	int v6; // eax
	char v7; // al
	int v8; // ecx
	int v9; // [esp-4h] [ebp-20h]
	int x; // [esp+Ch] [ebp-10h]
	int y; // [esp+10h] [ebp-Ch]
	int v12; // [esp+14h] [ebp-8h]
	int error_id; // [esp+1Bh] [ebp-1h]

	if ( plr[myplr]._pmode )
		return;
	v12 = 0;
	if ( trigflag[4] <= 0 )
		return;
	v0 = &trigs[0]._tmsg;
	while ( 1 )
	{
		v1 = myplr;
		v2 = plr[myplr].WorldX;
		if ( v2 != *(v0 - 2) )
			goto LABEL_34;
		v3 = plr[v1].WorldY;
		if ( v3 != *(v0 - 1) )
			goto LABEL_34;
		v4 = *v0;
		if ( *v0 == WM_DIABNEXTLVL )
		{
			if ( pcurs >= CURSOR_FIRSTITEM && DropItemBeforeTrig() )
				return;
			v6 = currlevel + 1;
			goto LABEL_32;
		}
		if ( *v0 == 1027 )
		{
			if ( pcurs >= CURSOR_FIRSTITEM && DropItemBeforeTrig() )
				return;
			v6 = currlevel - 1;
LABEL_32:
			v9 = v6;
			goto LABEL_33;
		}
		if ( *v0 != 1028 )
			break;
		StartNewLvl(myplr, v4, ReturnLvl);
LABEL_34:
		++v12;
		v0 += 4;
		if ( v12 >= trigflag[4] )
			return;
	}
	if ( *v0 != 1031 )
	{
		if ( *v0 == 1032 )
		{
			TWarpFrom = currlevel;
			StartNewLvl(myplr, v4, 0);
		}
		else
		{
			TermMsg("Unknown trigger msg");
		}
		goto LABEL_34;
	}
	if ( gbMaxPlayers == 1 )
		goto LABEL_46;
	v5 = 0;
	if ( v0[1] == 5 && plr[v1]._pLevel < 8 )
	{
		v5 = 1;
		x = plr[myplr].WorldX;
		_LOBYTE(y) = v3 + 1;
		_LOBYTE(error_id) = 40;
	}
	if ( v0[1] == 9 && plr[v1]._pLevel < 13 )
	{
		v5 = 1;
		_LOBYTE(x) = v2 + 1;
		y = plr[v1].WorldY;
		_LOBYTE(error_id) = 41;
	}
	if ( v0[1] == 13 && plr[v1]._pLevel < 17 )
	{
		x = plr[myplr].WorldX;
		v5 = 1;
		_LOBYTE(y) = v3 + 1;
		_LOBYTE(error_id) = 42;
	}
	if ( !v5 )
	{
LABEL_46:
		v9 = v0[1];
LABEL_33:
		StartNewLvl(myplr, *v0, v9);
		goto LABEL_34;
	}
	v7 = plr[myplr]._pClass;
	switch ( v7 )
	{
		case UI_WARRIOR:
			v8 = PS_WARR43;
			goto LABEL_42;
		case UI_ROGUE:
			v8 = PS_ROGUE43;
			goto LABEL_42;
		case UI_SORCERER:
			v8 = PS_MAGE43;
LABEL_42:
			PlaySFX(v8);
			break;
	}
	_LOBYTE(v2) = error_id;
	InitDiabloMsg(v2);
	NetSendCmdLoc(1u, 1u, x, y);
}
// 679660: using guessed type char gbMaxPlayers;
// 6ABB30: using guessed type int TWarpFrom;
